package com.loopy.json;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.math.BigInteger;
import java.util.*;

public class JavaJSon {
    public static void main(String[] args) {
        Gson gson = new Gson();
        Book book1 = new Book(100, "红楼梦");
        String strBook = gson.toJson(book1);
        System.out.println(strBook);
        Book book = gson.fromJson(strBook, Book.class);
        System.out.println(book);
        List<Book> books = new ArrayList<>();
        books.add(new Book(100,"红楼梦"));
        books.add(new Book(200,"西游记"));
        System.out.println(books);
        String strbookList = gson.toJson(books);
        System.out.println(strbookList);
        //(1) 如果我们 new TypeToken<List<Book>>() 提示//'TypeToken()' has protected access in 'com.google.gson.reflect.TypeToken'
        // (2) 因为TypeToken 的无参构造器protected ， 而 new TypeToken<List<Book>>() 就是调用其无参构
        // (3) 根据java基础，如果一个方法protected ，而且不在同一个包， 是不能直接访问的，因此报错
        // (4) 为什么 new TypeToken<List<Book>>() 使用就可以，这里就涉及到匿名内部类的知识
        // (5)当 new TypeToken<List<Book>>() 其实这个类型就不是 TypeToken 而是一个匿名内部类
        Type type = new TypeToken<List<Book>>() {}.getType();
        System.out.println(type);
        List<Book>  bookList = gson.fromJson(strbookList, type);
        System.out.println(bookList);

        Map<String, String> bookMap = new HashMap<String, String>();
        bookMap.put("k1","红楼梦");
        bookMap.put("k2","西游记");
        System.out.println(bookMap);
        String strbookMap = gson.toJson(bookMap);
        System.out.println(strbookMap);
        Type type1 = new TypeToken< Map<String, String>>() {}.getType();
        Map<String, String> o = gson.fromJson(strbookMap, type1);
        System.out.println(o);

    }
}
